
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of ProveedoresData.
	/// </summary>
	public class ProveedoresData : Singleton<ProveedoresData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

        #region Methods

        /// <summary>
        /// Selects all records from the Proveedores table by Nombre.
        /// </summary>
        public IList<Proveedores> ListarByNombre(string nombre)
        {
            var entidades = new List<Proveedores>();
            var comando = BaseDatos.GetStoredProcCommand("SelectProveedoresByRazonSocial");

            BaseDatos.AddInParameter(comando, "razonSocial", DbType.String, nombre);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Proveedores
                    {
                        proveedorID = lector.IsDBNull(lector.GetOrdinal("proveedorID")) ? default(short) : lector.GetInt16(lector.GetOrdinal("proveedorID")),
                        RUC = lector.IsDBNull(lector.GetOrdinal("RUC")) ? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
                        razonSocial = lector.IsDBNull(lector.GetOrdinal("razonSocial")) ? default(string) : lector.GetString(lector.GetOrdinal("razonSocial")),
                        direccion = lector.IsDBNull(lector.GetOrdinal("direccion")) ? default(string) : lector.GetString(lector.GetOrdinal("direccion")),
                        telefono = lector.IsDBNull(lector.GetOrdinal("telefono")) ? default(string) : lector.GetString(lector.GetOrdinal("telefono")),
                        email = lector.IsDBNull(lector.GetOrdinal("email")) ? default(string) : lector.GetString(lector.GetOrdinal("email")),
                        condicionesPago = lector.IsDBNull(lector.GetOrdinal("condicionesPago")) ? default(string) : lector.GetString(lector.GetOrdinal("condicionesPago"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the Proveedores table by RUC.
        /// </summary>
        public IList<Proveedores> ListarByRUC(string RUC)
        {
            var entidades = new List<Proveedores>();
            var comando = BaseDatos.GetStoredProcCommand("SelectProveedoresByRUC");

            BaseDatos.AddInParameter(comando, "RUC", DbType.String, RUC);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new Proveedores
                    {
                        proveedorID = lector.IsDBNull(lector.GetOrdinal("proveedorID")) ? default(short) : lector.GetInt16(lector.GetOrdinal("proveedorID")),
                        RUC = lector.IsDBNull(lector.GetOrdinal("RUC")) ? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
                        razonSocial = lector.IsDBNull(lector.GetOrdinal("razonSocial")) ? default(string) : lector.GetString(lector.GetOrdinal("razonSocial")),
                        direccion = lector.IsDBNull(lector.GetOrdinal("direccion")) ? default(string) : lector.GetString(lector.GetOrdinal("direccion")),
                        telefono = lector.IsDBNull(lector.GetOrdinal("telefono")) ? default(string) : lector.GetString(lector.GetOrdinal("telefono")),
                        email = lector.IsDBNull(lector.GetOrdinal("email")) ? default(string) : lector.GetString(lector.GetOrdinal("email")),
                        condicionesPago = lector.IsDBNull(lector.GetOrdinal("condicionesPago")) ? default(string) : lector.GetString(lector.GetOrdinal("condicionesPago"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

		/// <summary>
		/// Selects all records from the Proveedores table by a foreign key.
		/// </summary>
		public IList<Proveedores> Listar()
		{
			var entidades = new List<Proveedores>();
			var comando = BaseDatos.GetStoredProcCommand("SelectAllProveedores");

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new Proveedores
					{
						proveedorID = lector.IsDBNull(lector.GetOrdinal("proveedorID"))? default(short) : lector.GetInt16(lector.GetOrdinal("proveedorID")),
						RUC = lector.IsDBNull(lector.GetOrdinal("RUC"))? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
						razonSocial = lector.IsDBNull(lector.GetOrdinal("razonSocial"))? default(string) : lector.GetString(lector.GetOrdinal("razonSocial")),
						direccion = lector.IsDBNull(lector.GetOrdinal("direccion"))? default(string) : lector.GetString(lector.GetOrdinal("direccion")),
                        telefono = lector.IsDBNull(lector.GetOrdinal("telefono")) ? default(string) : lector.GetString(lector.GetOrdinal("telefono")),
                        email = lector.IsDBNull(lector.GetOrdinal("email")) ? default(string) : lector.GetString(lector.GetOrdinal("email")),
                        condicionesPago = lector.IsDBNull(lector.GetOrdinal("condicionesPago")) ? default(string) : lector.GetString(lector.GetOrdinal("condicionesPago"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the Proveedores table by a foreign key.
		/// </summary>
		public Proveedores Obtener(short proveedorID)
		{
			var proveedores = default(Proveedores);
			var comando = BaseDatos.GetStoredProcCommand("SelectProveedores");

			BaseDatos.AddInParameter(comando, "proveedorID", DbType.Int16, proveedorID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					proveedores = new Proveedores
					{
						proveedorID = lector.IsDBNull(lector.GetOrdinal("proveedorID"))? default(short) : lector.GetInt16(lector.GetOrdinal("proveedorID")),
						RUC = lector.IsDBNull(lector.GetOrdinal("RUC"))? default(string) : lector.GetString(lector.GetOrdinal("RUC")),
						razonSocial = lector.IsDBNull(lector.GetOrdinal("razonSocial"))? default(string) : lector.GetString(lector.GetOrdinal("razonSocial")),
						direccion = lector.IsDBNull(lector.GetOrdinal("direccion"))? default(string) : lector.GetString(lector.GetOrdinal("direccion")),
                        telefono = lector.IsDBNull(lector.GetOrdinal("telefono")) ? default(string) : lector.GetString(lector.GetOrdinal("telefono")),
                        email = lector.IsDBNull(lector.GetOrdinal("email")) ? default(string) : lector.GetString(lector.GetOrdinal("email")),
                        condicionesPago = lector.IsDBNull(lector.GetOrdinal("condicionesPago")) ? default(string) : lector.GetString(lector.GetOrdinal("condicionesPago"))
					};
				}
			}
			comando.Dispose();
			return proveedores;
		}

		/// <summary>
		/// Saves a record to the Proveedores table.
		/// </summary>
		public short Agregar(Proveedores proveedores)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertProveedores");
			BaseDatos.AddOutParameter(comando, "proveedorID", DbType.Int16, 2);
			BaseDatos.AddInParameter(comando, "RUC", DbType.String, proveedores.RUC);
			BaseDatos.AddInParameter(comando, "razonSocial", DbType.String, proveedores.razonSocial);
			BaseDatos.AddInParameter(comando, "direccion", DbType.String, proveedores.direccion);
            BaseDatos.AddInParameter(comando, "telefono", DbType.String, proveedores.telefono);
            BaseDatos.AddInParameter(comando, "email", DbType.String, proveedores.email);
            BaseDatos.AddInParameter(comando, "condicionesPago", DbType.String, proveedores.condicionesPago);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Agregar Proveedores.");

			var valorDevuelto = (short)BaseDatos.GetParameterValue(comando, "proveedorID");;
			comando.Dispose();
			return valorDevuelto;
		}

		/// <summary>
		/// Updates a record in the Proveedores table.
		/// </summary>
		public bool Modificar(Proveedores proveedores)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateProveedores");
			BaseDatos.AddInParameter(comando, "proveedorID", DbType.Int16, proveedores.proveedorID);
			BaseDatos.AddInParameter(comando, "RUC", DbType.String, proveedores.RUC);
			BaseDatos.AddInParameter(comando, "razonSocial", DbType.String, proveedores.razonSocial);
			BaseDatos.AddInParameter(comando, "direccion", DbType.String, proveedores.direccion);
            BaseDatos.AddInParameter(comando, "telefono", DbType.String, proveedores.telefono);
            BaseDatos.AddInParameter(comando, "email", DbType.String, proveedores.email);
            BaseDatos.AddInParameter(comando, "condicionesPago", DbType.String, proveedores.condicionesPago);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar Proveedores.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Proveedores table by its primary key.
		/// </summary>
		public bool Eliminar(short proveedorID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteProveedores");
			BaseDatos.AddInParameter(comando, "proveedorID", DbType.Int16, proveedorID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Proveedores.");
			comando.Dispose();
			return true;
		}

		#endregion
	}
}
